package com.ltmonitor.thread;

import java.net.Inet4Address;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.poi.poifs.storage.HeaderBlockWriter;
import org.springframework.beans.factory.annotation.Autowired;

import com.ltmonitor.entity.TerminalCommand;
import com.ltmonitor.service.IQueryService;
import com.ltmonitor.service.ITerminalCommandService;
import com.ltmonitor.service.JT808Constants;
import com.ltmonitor.web.controller.VehicleAction;
import com.ltmonitor.web.util.SpringApplicationContextHolder;

/**
 * 换卡所需定时拍照功能服务,3秒执行一次
 * @author Administrator
 *
 */
public class GetChCardPicServiceThread extends BasicServiceThread {

	public GetChCardPicServiceThread(String name, int sleepNum) {
		super(name, sleepNum);
		// TODO Auto-generated constructor stub
	}
	
	/////------------------------------------------------------------------------变量
	
	//查询服务
	private IQueryService queryService;
	
	//命令服务
	private ITerminalCommandService terminalCommandService;
	
	
	//车辆查询语句
	private String queryId = "dataProcess.getVehOnlineDatas";
	//车辆列表
	private List vehList = null;
	
	//定义车辆ID临时保存map
	private Map listMap = new HashMap ();
	
	private int index = -1;//定义需要处理的数据所在数据索引,默认为-1；
	
	private int sendNum = 0;//定义已发送车辆数量，默认为0
 	
	
	
	//定义间隔拍照时间，单位为秒，暂定为30分钟
	private int minValue = 30 * 60;
	
	//每次处理的车辆数量，默认为0
	private int vehCount = 0;
	
	//每次最大处理数量
	private int vehTopCount = 10;
	
	
	
	/////------------------------------------------------------------------------重写父类方法
	
	//重写服务初始化方法
	protected String threadServiceInit() {
		String msg = "";
		
		if(terminalCommandService == null) {
			terminalCommandService = SpringApplicationContextHolder.getBean("terminalCommandService");
		}
		
		if(terminalCommandService == null) {
			msg += "命令下发服务对象为null，无法发送拍照命令！";
		}
//		outInfo("定时拍照服务初始化代码.........");
//		sleepCount = 10; // 定义10次执行代码，即30秒
		msg += getVehData();
		return msg;
	}
	
	
	//重写服务执行方法
	protected void threadServiceRun() {
		int min = Calendar.getInstance().get(Calendar.MINUTE);
		
		
		String msg = "";
		
		if(min % 10 == 0) {
			int second = Calendar.getInstance().get(Calendar.SECOND);
			
			//加载数据 ， 0-3秒
			if(second >= 0 && second < 3) {
				msg += getVehData();
			}
			
			// 重置索引,4-6秒
			if (second >= 4 && second < 7) {
				if (min == 0 || min == 30) {
					reSetIndex();
				}
			}	
		}
		//发送拍照命令
		if(msg.equals("")) {
			sendPicCmd();
		}else {
			outError(msg);
			checkError();
		}
		
	}
	
	////////////////////////////////////////////////////////////////////////////私有方法
	
	
	//获取车辆数据
	private String getVehData() {
		String msg = "";
		try {
			if(queryService == null) {
				queryService = SpringApplicationContextHolder.getBean("queryService");
			}
			
			
			if(queryService != null) {
				Map map = new HashMap();
				List tempList = queryService.query(queryId,map);
				if( tempList != null ) {
					vehList = tempList;
//					outInfo("当前车辆数：" + tempList.size());
				}
			}else {
				msg +="查询服务对象为空，无法查询车辆数据！";
			}
			
			//计算
			if(vehList != null && vehList.size() > 0) {
				int temp =  (( vehList.size() *  sleepNum * sleepCount) / (minValue * 1000 )) + 1 ;
				if(temp > 0) {
					temp = ( temp + vehTopCount ) / 2;
					vehCount = temp;
					outInfo("更新车辆列表成功，当前共有车辆 " + vehList.size() + " 个 ， 每次需要处理的车辆数为： " + temp);
				}else {
					msg += "计算每次处理车辆数失败！无法下发拍照命令！";
				}
			}else {
				msg += "获取车辆数据失败：当前车辆数据为空！";
			}
			
			
		} catch (Exception e) {
			// TODO: handle exception
			msg +="获取车辆数据失败：" + e.getMessage();
		}
		return msg;
	}
	
	//重置列表索引，重新开始发布命令
	private void reSetIndex() {
		if(index > 200 || index <-1) {
			index = -1;
			sendNum = 0;
			listMap.clear();
			outInfo("重置索引信息，重置车辆ID缓存map，从0开始下发拍照命令！");
		}
	}
	
	//下发拍照命令
	private void sendPicCmd() {
		if(vehList != null  && vehList.size() > 0) {
			for(int i=0 ; i< vehCount ; i++) {
				index ++ ;
				if(index >= 0 &&  index < vehList.size()) {
					Map temp =(Map) vehList.get(index);										
					
					//判断map中的数据不为空
					if(temp.get("online") != null 
							&& temp.get("vehicleId") != null 
							&& temp.get("plateNo") != null
							&& temp.get("simNo") != null
							&& temp.get("ID") != null ) {
						
						if(listMap.get(temp.get("ID").toString()) == null) {
							//在线，则下命令
							if (temp.get("online").toString().equals("true")) {
//								outInfo("第" + (index + 1) + "条车辆数据为：" + temp.toString());
//								outInfo("发送拍照命令..........");
								sendNum ++ ;
								sendCmd(temp, 1);
//								sendCmd(temp, 2);
//								sendCmd(temp, 3);
							}
						}
						
					}
					
				}else if(index == vehList.size()){
					outInfo("本轮车辆拍照命令下发完成，共计发送车辆 "  + sendNum + " 辆！");
				}// end if index 			
			}//end for 
		}
	}
	
	
	//下发命令
	private void sendCmd(Map map,int channedId) {
		try {
			String cmdData = channedId + ";1;10;0;3;5;125;125;125;125";
			TerminalCommand tc = new TerminalCommand();
			tc.setCmdType(JT808Constants.CMD_TAKE_PHOTO);
			tc.setCmdData(cmdData);
			tc.setVehicleId(Long.parseLong(map.get("vehicleId").toString()));
			tc.setPlateNo(map.get("plateNo").toString());
			tc.setSimNo(map.get("simNo").toString());
			tc.setUserId(1);
			tc.setOwner("系统管理员");
			tc.setUpdateDate(tc.getCreateDate());
			tc.setStatus(TerminalCommand.STATUS_NEW);
			terminalCommandService.save(tc);
			
		} catch (Exception e) {
			// TODO: handle exception
			outInfo("本次车辆数据为：" + map.toString());
			String msg = "下发通道" + channedId + "拍照命令失败：" + e.getMessage();
		}
	}
	
	
}
